#!/bin/bash

################################################################################
# 脚本名称：find-default-network-device.sh
# 功能描述：
#   本脚本用于获取系统默认网络设备，提供四种不同的方法：
#     方法1：使用 ip route | sed | cut（只取第一个默认路由）
#     方法2：使用 ip route get 8.8.8.8 | awk
#     方法3：使用 route -n | awk
#     方法4：使用 nmcli（需要 NetworkManager 支持）
#
# 使用方法：
#   ./find-default-network-device.sh             # 显示所有方法的结果
#   ./find-default-network-device.sh -m 1          # 仅使用方法1
#   ./find-default-network-device.sh -h | --help    # 查看帮助信息
################################################################################

# 方法1：使用 ip route、sed、cut，并只返回第一个默认网络接口
get_default_device_method1() {
    ip route | sed -e '/^.*default.*/!d' -e 's/^.*dev.//' | cut -f1 -d ' ' | head -n 1
}

# 方法2：使用 ip route get 命令
get_default_device_method2() {
    ip route get 8.8.8.8 | awk '{for(i=1;i<=NF;i++) if($i=="dev") {print $(i+1); exit}}'
}

# 方法3：使用 route -n 命令
get_default_device_method3() {
    route -n | awk '$1 == "0.0.0.0" {print $8; exit}'
}

# 方法4：使用 nmcli 命令（仅适用于使用 NetworkManager 的系统）
get_default_device_method4() {
    if command -v nmcli >/dev/null 2>&1; then
        nmcli -t -f DEVICE,STATE d | awk -F: '$2=="connected" {print $1; exit}'
    else
        echo "nmcli 未安装或未配置"
    fi
}

# 帮助信息
usage() {
    echo "用法: $0 [-m 方法编号]"
    echo "    -m 1 : 使用方法1 (ip route | sed | cut)"
    echo "    -m 2 : 使用方法2 (ip route get 8.8.8.8 | awk)"
    echo "    -m 3 : 使用方法3 (route -n | awk)"
    echo "    -m 4 : 使用方法4 (nmcli)"
    echo "如果不指定 -m 参数，则显示所有方法的结果。"
    echo "示例: $0 -m 1"
}

# 主函数
main() {
    local method=""
    
    # 解析参数
    while [[ $# -gt 0 ]]; do
        case "$1" in
            -m)
                shift
                method="$1"
                ;;
            -h|--help)
                usage
                exit 0
                ;;
            *)
                ;;
        esac
        shift
    done

    # 根据参数选择调用方法
    if [[ -n "$method" ]]; then
        case "$method" in
            1)
                echo "【方法1】(ip route | sed | cut)："
                dev=$(get_default_device_method1)
                echo "默认网络设备：$dev"
                ;;
            2)
                echo "【方法2】(ip route get 8.8.8.8 | awk)："
                dev=$(get_default_device_method2)
                echo "默认网络设备：$dev"
                ;;
            3)
                echo "【方法3】(route -n | awk)："
                dev=$(get_default_device_method3)
                echo "默认网络设备：$dev"
                ;;
            4)
                echo "【方法4】(nmcli)："
                dev=$(get_default_device_method4)
                echo "默认网络设备：$dev"
                ;;
            *)
                echo "无效的方法编号：$method"
                usage
                exit 1
                ;;
        esac
    else
        # 显示所有方法的结果
        echo "【方法1】(ip route | sed | cut)："
        dev1=$(get_default_device_method1)
        echo "默认网络设备：$dev1"
        echo

        echo "【方法2】(ip route get 8.8.8.8 | awk)："
        dev2=$(get_default_device_method2)
        echo "默认网络设备：$dev2"
        echo

        echo "【方法3】(route -n | awk)："
        dev3=$(get_default_device_method3)
        echo "默认网络设备：$dev3"
        echo

        echo "【方法4】(nmcli)："
        dev4=$(get_default_device_method4)
        echo "默认网络设备：$dev4"
    fi
}

main "$@"
